闲扯
这道题改了半天,就是找不到哪儿错了。结果最后发现线段树的写法和平常有些不一样,数组越界了。。。
题面
Solution
将矩形按照竖边分成一段一段的,每次计算一段的贡献。
每段的距离很好算,直接减就可以了,我们需要维护的是在这一段里包括的小矩形的高的和。
对于这个我们用线段树维护。
线段树里面记录两个值 $cnt,len$ 。
分别表示这个区间被覆盖了几次和这个区间的贡献。
统计这段区间的贡献时,需要分类讨论。
- 若 $cnt=0$ ,则该区间的贡献为两个子区间的贡献之和。
- 若 $cnt>0$ ,则该区间的贡献为该区间表示的高度总和。
但是这里没有判断 $l==r$ 的终止条件,需要我们手动判断一下。
$ps:$ 线段树的下标表示小段的左端点,所以每次只需要修改 $l\sim r-1$ 。
Code
1 |
|
总结
一定要注意数组是否越界,不然会访问到一些莫名其妙的东西。